local respond_to      = require("lapis.application").respond_to
local csrf_tool       = require("utils.csrf_tool")
local capture_errors  = require("lapis.application").capture_errors

return respond_to({
	GET = function(self)
		-- Si un usuario inició sesión, es redireccionado a la página principal.
		if self.session.user then
			return { redirect_to = self:url_for("index") }
		else
			self.head_title = "Regístrate"

			-- Genera un token contra ataques CSRF con tiempo de expiración.
			self.csrf_token = csrf_tool.generate_token(self)

			if self.session.message then
				self.message         = self.session.message
				self.session.message = nil
			end

			return { render = "pages.signup" }
		end
	end,
	POST = capture_errors({
		-- Captura y muestra fallos (excepciones) dentro de una plantilla.
		on_error = require('utils.errors'),
		function(self)
			-- Autentifica y valida el tiempo de expiración del token.
			csrf_tool.validation_token(self)

			-- Selecciona los campos de un formulario que solo son necesarios y
			-- elimina espacios sobrantes de inicio y fin.
			local inputs_form = { "name", "username", "email", "password", "password_confirm" }

			local trim = require("lapis.util").trim
			local data = {}

			for index,input in ipairs(inputs_form) do
				data[input] = trim(self.params[input])
			end

			-- Valida los campos de un formulario.			
			local validate = require("utils.validate")

			validate.assert_valid(data, {
				{ "name",             exists = true, min_length = 5, max_length = 255, type        = "string" },
				{ "username",         exists = true, min_length = 1, max_length = 255, not_spaces  = true, is_username = true, type = "string" },
				{ "email",            exists = true, min_length = 5, max_length = 255, is_email    = true, type        = "string" },
				{ "password",         exists = true, min_length = 6, max_length = 255, not_spaces  = true, type        = "string" },
				{ "password_confirm", exists = true, equals = data.password}
			})

			local object = require("controllers.userController")

			-- Registra un nuevo usuario.
			self.session.message = object:userSignup(data)

			return { redirect_to = self:url_for("signup") }
		end
	})
})